/*
 * Ant Group
 * Copyright (c) 2004-2023 All Rights Reserved.
 */
package com.kinghunt.misp.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 反射工具类
 *
 * @author jinping
 * @version ReflectionUtil.java, v 0.1 2023年10月27日 13:54 jinping
 */
@Slf4j
public class ReflectionUtil {

    /**
     * 通过反射设置一个对象的指定属性
     */
    public static void setObjectProperty(Object object, String name, Object value) {
        if (value == null || object == null || StringUtils.isBlank(name)) {
            return;
        }
        log.debug("设置对象" + name + "属性");
        try {
            Field field = findTargetFiled(object, name);
            if (field == null) {
                return;
            }

            field.setAccessible(true);
            field.set(object, value);
        } catch (IllegalAccessException e) {
            log.warn("对象设置属性异常", e);
        }
    }

    /**
     * 从父类以及子类中找到属性
     *
     * @param object
     * @param filedName
     * @return
     */
    public static Field findTargetFiled(Object object, String filedName) {
        List<Field> fieldList = new ArrayList<>();
        Class objectClass = object.getClass();
        while (objectClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
            fieldList.addAll(Arrays.asList(objectClass.getDeclaredFields()));
            objectClass = objectClass.getSuperclass(); //得到父类,然后赋给自己
        }
        Field field = null;
        for (Field f : fieldList) {
            if (StringUtils.equals(f.getName(), filedName)) {
                field = f;
                break;
            }
        }
        return field;
    }
}